#include "app_mqtt.h"
#include "MQTTClient.h"
#include "log.h"

static MQTTClient mqttclient;
//连接参数模板
static MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;

static MQTTClient_message  msg= MQTTClient_message_initializer;


static  int (*recieve_callback)(char *data,int len);

// 失连回调
static void  app_mqtt_connectionLost(void* context, char* cause)
{
    log_error("MQTTClient_connectionLost: %s", cause);
    // 销毁
    MQTTClient_destroy(&mqttclient);
}
//消息到达回调   // 注意：这里的返回值 1是成功 0是失败
static int app_mqtt_messageArrived(void* context, char* topicName, int topicLen, MQTTClient_message* msg)
{   // 1 把消息内容从message中提取出来 
    char* data= msg->payload;
    int len = msg->payloadlen;
    // 2 调用注册在消息队列模块中的处理回调函数
    if(recieve_callback==NULL)
    {
        log_error("recieve_callback is NULL");
        return 0;
    }
 
    int ret=  recieve_callback(data,len);
     //3释放msg 主题
     MQTTClient_freeMessage(&msg);
     MQTTClient_free(topicName);
    if(ret!=0)
    {
        log_error("app_mqtt_messageArrived: recieve_callback error");
        return 0;// 失败
    }

    return 1;
}

//消息发送成功的回调
void app_mqtt_deliveryComplete(void* context, MQTTClient_deliveryToken dt)
{
    log_info(" 消息发送成功 " );
}




/**
 * @brief  初始化mqtt
 * 
 * 
 *  1    创建一个客户端实例  （init）
    2    设置事件的回调函数   1  失联事件  2  消息到达事件 3 消息发送成功事件   （init）
    3    客户端正式连接服务端  （init）
    4    客户端订阅主题    （init）
 */
int app_mqtt_init()
{
// 1    创建一个客户端实例  （init）
   int ret= MQTTClient_create(&mqttclient, mqtt_broker_url, mqtt_client_id, MQTTCLIENT_PERSISTENCE_NONE, NULL);
   if(ret != MQTTCLIENT_SUCCESS)
    {
        log_error("MQTTClient_create failed");
        return -1;
    }

//2    设置事件的回调函数   1  失联事件  2  消息到达事件 3 消息发送成功事件   （init）
    MQTTClient_setCallbacks(mqttclient, NULL, app_mqtt_connectionLost, app_mqtt_messageArrived, app_mqtt_deliveryComplete);

//3    客户端正式连接服务端  （init）
    ret= MQTTClient_connect(mqttclient, &conn_opts);
    if(ret != MQTTCLIENT_SUCCESS)
    {
        log_error("MQTTClient_connect failed");
        return -1;
    }
    printf("MQTTClient_connect  success! \n");
//4    客户端订阅主题    （init）

    MQTTClient_subscribe(mqttclient, mqtt_topic_receive, mqtt_qos_level);

    return 0;

}


/**
 * @brief  发送消息
 * @param  要发送的数据 
 * @param  要发送的数据长度
 * 
 */
int app_mqtt_send(char *data,int len)
{
    msg.payload = data;
    msg.payloadlen = len;
    msg.qos = mqtt_qos_level;
    int ret= MQTTClient_publishMessage(mqttclient, mqtt_topic_send, &msg, NULL);
    if (ret==-1)
    {
        log_error("MQTTClient_publishMessage error");
        return -1;
    }
    return 0;
    

}



/**
* @brief  由外部向消息队列模块中注册回调函数
* @param  回调函数
* @return  0  成功  -1 失败
*/
int app_mqtt_register_callback(int (*callback)(char *data,int len))
{
    recieve_callback=callback;
    return 0;
}


/**
* @brief 销毁消息队列的相关资源
*  1  关闭连接
*  2  销毁消息队列句柄
*/
void app_mqtt_destroy()
{
    MQTTClient_disconnect(mqttclient,1000);
    MQTTClient_destroy(&mqttclient);

}